/**
 * Looker  新闻整合系统
 * Author  :solosky <solosky772@qq.com>
 * File    :Data.js
 * Date    :August 5, 2009
 * License : Apache License 2.0 
 */

/**
 *  日志记录
 */
 
 var Logger = {
	 
	 /////////////////////////////////////////////////////////////////////////////////////////////////////
	 
	 //顶部的提示框
	 tray 		: $('<div id="log-tray"><span><a href="#">调试窗口</a></span></div>'),			
	 //信息窗口
	 console	: $('<div id="log-console">'+
						'<div class="log-title">'+
							'<span class="log-title-title">调试窗口</span>'+
							'<span class="log-title-action">'+
								'<input type="checkbox" value="true" name="autoOpen" checked="checked" class="action-autoOpen"/>自动显示'+
								'<a href="#" class="action-clear">清除信息</a>'+
								'<a href="#" class="action-hide">折叠/隐藏</a>'+
							'</span>'+
						'</div>'+
						'<div class="log-content">'+
						'</div>'+
						'<div class="log-stat">记录<span class="log-stat-all">0</span> 错误<span class="log-stat-error">0</span>警告<span class="log-stat-warn">0</span></div>'+
					'</div>'),
	 
	 //快捷方式,减少多次的查找，提高性能
	 access : {
		logContent   : null,
		logStatAll   : null,
		logStatError : null,
		logStatWarn  : null
	},
	
	//有信息时是否自动展开
	autoOpen : false,
	//当前信息窗口是否显示
	isShow   : false,
	//是否启用
	enabled : true,
	//统计信息
	stat 	 : {
			info	: 0,
			debug	: 0,
			error 	: 0,
			warn	: 0,
			all		: 0
		
		},
					
	 /////////////////////////////////////////////////////////////////////////////////////
	 //初始化函数，在body的onload事件中触发
	 init 	: function(){
		 if(!this.enabled) return;
		 //将提示框和信息窗口动态载入窗口，并绑定事件	
		 var togglefn = function(){Logger.toggle();};
		 var clearfn  = function(){Logger.clear();};
		 var autofn   = function(){Logger.setAutoOpen();};
		 var errorfn  = function(a,b,c){Logger.onError(a,b,c)};
		 this.tray.find("span a").click(togglefn);				//信息窗口显示/隐藏
		 this.console.find(".action-hide").click(togglefn);		//信息窗口显示/隐藏		 
		 this.console.find(".action-clear").click(clearfn);		//信息窗口 清除信息
		 this.console.find(".action-autoOpen").click(autofn);	//信息窗口 设置自动显示
		 window.onerror = errorfn;								//设置错误回调函数
		 
		 //设置快捷访问变量
		 this.access.logContent   = this.console.find(".log-content");
		 this.access.logStatAll   = this.console.find(".log-stat-all");
		 this.access.logStatError = this.console.find(".log-stat-error");
		 this.access.logStatWarn = this.console.find(".log-stat-warn");
		 //初始化可拖动
		 $(this.console).draggable({ handle:".log-title",cursor:"move" });		
		 //载入DOM
		 $("body").append(this.tray);
		 $("body").append(this.console);
		 
		 
		 
	 },
	 
	 //显示/隐藏信息窗口
	 toggle : function(){
		 //this.trace();
		 this.console.toggle();
		 this.isShow = !this.isShow; 
		 		// alert(this.isShow);
		 
	 },
	 
	 //清除信息窗口的信息
	 clear	: function(){
		//清除信息框中信息
		this.access.logContent.html(""); 
		this.access.logStatAll.html("0");
		this.access.logStatError.html("0");
		this.access.logStatWarn.html("0");
		//重置统计信息
		this.stat.info  = 0;
		this.stat.debug = 0;
		this.stat.error = 0;
		this.stat.warn = 0;
		this.stat.all   = 0;
		
		
	 },
	 
	 //设置自动显示
	 setAutoOpen : function(e){
		 alert(e.srcElement);
	 },
	 //更新统计信息
	 updateStat : function(level){
		 ++ this.stat[level];
		 ++ this.stat["all"];
		this.access.logStatAll.html(this.stat["all"]);
		this.access.logStatError.html(this.stat["error"] );	 
		this.access.logStatWarn.html(this.stat["warn"] );	 
	 },
	 
	 //最基本的日志记录函数
	 log : function(msg,level){
		if(!this.enabled) return; 
		var date = new Date();
	 	var html = ['<div class="log-level-', level, '"> [',date.getFullYear(),'-',date.getMonth(),'-',date.getDay(),' ',date.getHours(),':', Util.Str.pad(String(date.getMinutes()),"0",2,"left"),":",Util.Str.pad(String(date.getSeconds()),"0",2,"left"),'] ',Util.Str.pad(level,"&nbsp;",6,"right"),' - ',msg,'</div>'];
		this.access.logContent.append(html.join(""));
		this.updateStat(level);
		if(this.autoOpen && !this.isShow)
			this.toggle();
	 },
	 
	 //记录调试信息
	 debug : function(msg){
		this.log(msg, "debug"); 
	 },
	 
	 //记录基本信息
	 info : function(msg){
		this.log(msg, "info"); 
	 },
	 
	 //记录错误信息
	 error : function(msg){
		this.log(msg, "error"); 
	 },
	 
	 //记录警告信息
	 warn : function(msg){
		this.log(msg, "warn"); 
	 },
	 
	 //错误回调函数
	 onError : function(a,b,c){
		 this.error(a+" [line:"+c+" "+b+"]");
		 //this.trace();
		 return false;
	 },
	 
	 //查看调用堆栈,   TODO.. 这个仍需完善。。
	 trace : function(){
		 var callee = arguments.callee;	//调用对象
		 var msg = "";
		 while (callee && (callee != window)) {
			var args = callee.arguments, argn = args.length;
			//for (var i=0; i<argn; i++) {
			 //msg+='args['+i+']: '+args[i]+';';
			//}
			/*if(/function()/.test(callee))
				msg +="匿名函数";
			else{
				
			}*/
			msg +="<pre>"+callee+"</pre>";
			// 上一级
			callee = callee.caller;
		}
		 //输出到调试窗口
		 this.debug(msg);
	 }
 };
  